#pragma once

/*
工具类：包含的功能
    生成[0, 255]的伪随机数
    将多个伪随机数组成uuid
*/

#include<iostream>
#include<sstream>
#include<random>

#include "request/add_contact_request.pb.h"
#include "../dao/people_info.pb.h"
#include "exception.hpp"

using namespace add_contact_req;
using namespace people_info;

namespace web_contacts
{
    //生成伪随机数/生成uuid
    class RandomNumber
    {
    public:
        static unsigned int random_char()
        {
            //用于随机数引擎获取随机数种子
            std::random_device rd;
            //mt19937是C++新特性，是一种随机数算法，用法与rand()函数类似，但mt19937速度更快，周期长
            //作用是生成伪随机数
            std::mt19937 gen(rd());
            //随机生成一个整数 范围[0, 255]
            std::uniform_int_distribution<> dis(0, 255);
            return dis(gen);
        }

        //生成uuid(唯一标识符)
        static std::string generate_hex(const unsigned int len)
        {
            std::stringstream ss;
            //生成len个16进制随机数，并拼接起来
            for(int i = 0; i < len; ++i)
            {
                //获取伪随机数
                const auto rc = random_char();
                std::stringstream hexstream;
                //转化成16进制
                hexstream << std::hex << rc;
                auto hex = hexstream.str();
                ss << (hex.length() < 2 ? '0' + hex : hex);
            }
            return ss.str();
        }
    };
    //拷贝联系人的备注
    class MapCopy
    {
    public:
        static void map_copy(google::protobuf::Map<std::string, std::string> *target, 
                             const google::protobuf::Map<std::string, std::string> &source) 
        {
            if(target == nullptr)
                throw ContactException("map copy error : target map is nullptr!\n");
            for(auto it = source.cbegin(); it != source.cend(); ++it)
                target->insert({it->first, it->second});
        }
    };
}